package network;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    // 定义一个 socket 对象
    private DatagramSocket socket = null;

    // 关联端口
    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true) {
            // 1.读取请求并解析
            // 构造空壳
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            // 请求从网卡上来
            socket.receive(requestPacket);
            // 为了方便，我们把数据包变转换为 String 类型
            // 分配了 1024 个空间，但不一定被沾满，因此使用String类型的构造方法来减少开销！
            String request = new String(requestPacket.getData(),
                    0,requestPacket.getLength());

            // 2. 根据请求计算响应(此处内容省略，但很重要)
            String response = process(request);

            // 3. 把响应结果写回到客户端
            // 根据 response 字符串，构造一个 DatagramPacket
            // 和请求的 packet 不同，此处构造响应的时候，需要指定这个包发给谁
            // requestPacket.getSocketAddress() 得到的是客户端的 ip 和 端口
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
                    response.getBytes().length,
                    requestPacket.getSocketAddress());
            // 打印日志
            System.out.printf("[%s:%d] req: %s, resp: %s\n",
                    responsePacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
            // 解释
            // socket 是文件 - 介质
            // packet 是数据报 - 内容

        }

    }
    private String process(String request) {
        return request;
    }
    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer = new UdpEchoServer(4040);
        udpEchoServer.start();
    }
}

